deploy: Correctly swap bootloader version with new boot checksums
authorColin Walters <walters@verbum.org>
Fri, 20 Sep 2013 12:09:06 +0000 (08:09 -0400)
committerColin Walters <walters@verbum.org>
Fri, 20 Sep 2013 15:21:08 +0000 (11:21 -0400)
If we had two deployments with different boot checksums, and were
trying to remove the one that was the same and add a new one (the
normal case), we'd end up assuming due to comparison with 0 that
we only needed to do the fast subbootversion swap.

Fix this by actually putting 1 where we really mean 1.

And update the tests to verify the fix; I have double-verified by
undoing the fix, and noting that the test fails.

https://bugzilla.gnome.org/show_bug.cgi?id=708351

src/libostree/ostree-sysroot-deploy.c
tests/libtest.sh
tests/test-admin-deploy-2.sh

index e0232dd201b32868cb79333324d778c30952d6f2..14136d2462025b6f175f823454c870ffbb95c1e8 100644 (file)
@@ -980,18 +980,10 @@ bootcsum_counts_for_deployment_list (GPtrArray   *deployments)
     {
       OstreeDeployment *deployment = deployments->pdata[i];
       const char *bootcsum = ostree_deployment_get_bootcsum (deployment);
-      gpointer orig_key;
-      gpointer countp;
+      guint count;
 
-      if (!g_hash_table_lookup_extended (ret, bootcsum, &orig_key, &countp))
-        {
-          g_hash_table_insert (ret, (char*)bootcsum, GUINT_TO_POINTER (0));
-        }
-      else
-        {
-          guint count = GPOINTER_TO_UINT (countp);
-          g_hash_table_replace (ret, (char*)bootcsum, GUINT_TO_POINTER (count + 1));
-        }
+      count = GPOINTER_TO_UINT (g_hash_table_lookup (ret, bootcsum));
+      g_hash_table_replace (ret, (char*)bootcsum, GUINT_TO_POINTER (count + 1));
     }
   return ret;
 }
index fc6eef1b7f51753f301959d3d945fbbcfec9ffcc..c421b45253fb8a5230e5ac113fb88cab0d2d6117 100644 (file)
@@ -239,10 +239,15 @@ EOF
 
 os_repository_new_commit ()
 {
+    boot_checksum_iteration=$1
+    echo "BOOT ITERATION: $boot_checksum_iteration"
+    if test -z "$boot_checksum_iteration"; then
+       boot_checksum_iteration=0
+    fi
     cd ${test_tmpdir}/osdata
     rm boot/*
-    echo "new: a kernel" > boot/vmlinuz-3.6.0
-    echo "new: an initramfs" > boot/initramfs-3.6.0
+    echo "new: a kernel ${boot_checksum_iteration}" > boot/vmlinuz-3.6.0
+    echo "new: an initramfs ${boot_checksum_iteration}" > boot/initramfs-3.6.0
     bootcsum=$(cat boot/vmlinuz-3.6.0 boot/initramfs-3.6.0 | sha256sum | cut -f 1 -d ' ')
     export bootcsum
     mv boot/vmlinuz-3.6.0 boot/vmlinuz-3.6.0-${bootcsum}
index a133e701ec49c5dc724b73019c3427fdd76196da..2e6e248e23c7b0cf5da28de3c13aba59403d2342 100755 (executable)
@@ -39,20 +39,24 @@ assert_has_dir sysroot/boot/ostree/testos-${bootcsum}
 echo "ok deploy command"
 
 # Commit + upgrade twice, so that we'll rotate out the original deployment
-orig_bootcsum=${bootcsum}
+bootcsum1=${bootcsum}
 os_repository_new_commit
 ostree --repo=sysroot/ostree/repo remote add testos file://$(pwd)/testos-repo testos/buildmaster/x86_64-runtime
 ostree admin --sysroot=sysroot upgrade --os=testos
-os_repository_new_commit
+bootcsum2=${bootcsum}
+os_repository_new_commit "1"
+bootcsum3=${bootcsum}
 ostree --repo=sysroot/ostree/repo remote add testos file://$(pwd)/testos-repo testos/buildmaster/x86_64-runtime
 ostree admin --sysroot=sysroot upgrade --os=testos
 
 rev=${newrev}
 newrev=$(ostree --repo=sysroot/ostree/repo rev-parse testos/buildmaster/x86_64-runtime)
 assert_not_streq ${rev} ${newrev}
-assert_not_streq ${orig_bootcsum} ${bootcsum}
-assert_not_has_dir sysroot/boot/ostree/testos-${orig_bootcsum}
+assert_not_streq ${bootcsum1} ${bootcsum2}
+assert_not_streq ${bootcsum2} ${bootcsum3}
+assert_not_has_dir sysroot/boot/ostree/testos-${bootcsum1}
 assert_has_dir sysroot/boot/ostree/testos-${bootcsum}
+assert_has_dir sysroot/boot/ostree/testos-${bootcsum2}
 assert_file_has_content sysroot/ostree/deploy/testos/deploy/${newrev}.0/etc/os-release 'NAME=TestOS'
 
 echo "ok deploy and GC /boot"